import Router from '@koa/router';
import * as fs from 'fs';
import { consoleLog, LogType, LogLevel } from '../utils/logger';

const router = new Router();

/**
 * 自动注册路由
 * 扫描 routes 目录下所有 .routes.ts 或 .routes.js 文件并自动注册
 * 
 * 支持开发环境（ts-node）和生产环境（编译后的 JS）
 * 
 * @returns Promise<void> 路由注册完成的 Promise
 */
export async function registerRoutes(): Promise<void> {
  const routesDir = __dirname;
  
  // 读取目录下所有文件
  const files = fs.readdirSync(routesDir);
  
  // 过滤出所有路由文件（排除 index.ts 和 index.js）
  // 支持 .routes.ts（开发环境）和 .routes.js（生产环境）
  const routeFiles = files.filter(
    file => (file.endsWith('.routes.ts') || file.endsWith('.routes.js')) && 
            !file.startsWith('index.')
  );
  
  // 按文件名排序，确保注册顺序一致
  routeFiles.sort();
  
  // 动态导入并注册所有路由
  for (const file of routeFiles) {
    try {
      // 构建模块路径（移除扩展名，使用相对路径）
      const moduleName = file.replace(/\.(ts|js)$/, '');
      const modulePath = `./${moduleName}`;
      
      // 使用动态 import 加载模块
      const routeModule = await import(modulePath);
      
      // 检查是否是有效的路由模块
      if (routeModule.default && typeof routeModule.default.routes === 'function') {
        router.use(routeModule.default.routes(), routeModule.default.allowedMethods());
        const routeName = moduleName.replace(/\.routes$/, '');
        consoleLog(LogType.KOA, LogLevel.INFO, `✓ 已注册路由: ${routeName}`);
      } else {
        consoleLog(LogType.KOA, LogLevel.WARN, `⚠ 跳过无效路由文件: ${file} (未找到 default export 或 routes 方法)`);
      }
    } catch (error: any) {
      consoleLog(
        LogType.KOA,
        LogLevel.ERROR,
        `✗ 注册路由失败 ${file}: ${error?.message || String(error)}`,
        {
          error: error,
        }
      );
    }
  }
}

// 导出路由注册函数和路由实例
export default router;

